package com.hsp_java.set_;

import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings({"all"})
public class TreeSet_ {
    public static void main(String[] args) {
        // 1. 当我们用无参构造器
        // 2. 希望添加的元素按照字符串大小来排序
        // 3. 使用TreeSet 提供的一个构造器 ， 可以传入一个构造器(匿名内部类)
        // 并制定排序规则

        //TreeSet treeSet = new TreeSet();
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //如果要求加入的元素，按照长度大小排序
                int n1 = ((String)o1).length();
                int n2 = ((String)o2).length();
                return n1 - n2;
                //return ((String)o1).compareTo((String)o2);
            }
        });

        treeSet.add("lfm");
        treeSet.add("xkl");
        treeSet.add("whq");
        treeSet.add("wjt");
        treeSet.add("lfm");

        treeSet.add("lfm0");
        treeSet.add("lfm01");
        treeSet.add("lfm011");
        treeSet.add("lfm0112");

        System.out.println("treeSet=" + treeSet);

        //源码简单解读
        // 1. 构造器把传入的比较器对象 赋给了 TreeSet的底层的TreeMap的this.comparator属性
        /*
            public TreeMap(Comparator<? super K> comparator) {
                this.comparator = comparator;
            }

        // 2. 在调用 treeSet.add("xkl"); 在底层会执行到


        if (cpr != null) { //cpr 就是我们传入的匿名内部类 (对象)
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象) compare
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else //如果相等， 即返回0， 这个key就加入不了
                    return t.setValue(value);
            } while (t != null);
        }
         */

    }
}
